<html>
  <head>
	  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>i5ting_ztree_toc:node</title>
		<link href="toc/style/github-bf51422f4bb36427d391e4b75a1daa083c2d840e.css" media="all" rel="stylesheet" type="text/css"/>
		<link href="toc/style/github2-d731afd4f624c99a4b19ad69f3083cd6d02b81d5.css" media="all" rel="stylesheet" type="text/css"/>
		<link href="toc/css/zTreeStyle/zTreeStyle.css" media="all" rel="stylesheet" type="text/css"/>
	  <style>
		pre {
		    counter-reset: line-numbering;
		    border: solid 1px #d9d9d9;
		    border-radius: 0;
		    background: #fff;
		    padding: 0;
		    line-height: 23px;
		    margin-bottom: 30px;
		    white-space: pre;
		    overflow-x: auto;
		    word-break: inherit;
		    word-wrap: inherit;
		}

		pre a::before {
		  content: counter(line-numbering);
		  counter-increment: line-numbering;
		  padding-right: 1em; /* space after numbers */
		  width: 25px;
		  text-align: right;
		  opacity: 0.7;
		  display: inline-block;
		  color: #aaa;
		  background: #eee;
		  margin-right: 16px;
		  padding: 2px 10px;
		  font-size: 13px;
		  -webkit-touch-callout: none;
		  -webkit-user-select: none;
		  -khtml-user-select: none;
		  -moz-user-select: none;
		  -ms-user-select: none;
		  user-select: none;
		}

		pre a:first-of-type::before {
		  padding-top: 10px;
		}

		pre a:last-of-type::before {
		  padding-bottom: 10px;
		}

		pre a:only-of-type::before {
		  padding: 10px;
		}

		.highlight { background-color: #ffffcc } /* RIGHT */
		</style>
  </head>
  <body>
	  <div>
				<div style='width:25%;'>
						<ul id="tree" class="ztree" style='width:100%'>

						</ul>
				</div>
        <div id='readme' style='width:70%;margin-left:20%;'>
          	<article class='markdown-body'>
            	<p>01.初始node.js</p>
<p>​        已经掌握的技术  html   css  js</p>
<p>浏览器中的javascript的组成部分</p>
<p>浏览器中的javascript</p>
<p>js核心语法                              webApi</p>
<p>​    变量，数据类型                      dom操作</p>
<p>​    循环，分支，判断                   bom操作</p>
<p>​    函数，作用域，this                基于XMLHttpRequest的ajax操作</p>
<p>​    etc                                              etc</p>
<p>02.初识node.js</p>
<p>​    node.js是一个基于chrome V8 引擎的javascript运行环境（后端的）</p>
<p>​    node.js 运行环境</p>
<p>​                              内置api（提供内容可以做后端开发）</p>
<p>​            v8引擎        fs    path  http</p>
<p>​                                js内置对象  querystring  etc。。。</p>
<p>​            待执行的javascript代码</p>
<p>浏览器是js的前端运行环境</p>
<p> node是js的后端运行环境</p>
<p>node中没法调用bom和dom的浏览器内置API</p>
<p>node.js可以做什么？</p>
<p>​    01.基于express框架构建web应用</p>
<p>​    02.基于electron框架，可以构建跨平台的桌面应用</p>
<p>​    03.基于restify框架，可以快速构建Api接口项目</p>
<p>​    04.读写和操作数据库，创建实用的命令行工具辅助前端开发.etc...</p>
<p>怎么学习？</p>
<p>浏览器js学习路径</p>
<p>​            js基础语法  +  浏览器内置api（dom+bom） + 第三方库（vue，jq）</p>
<p>node学习路径</p>
<p>​            js语法       node的内置模块（fs，path，http等） + 第三方Api模块 （express,mysql等）</p>
<p>P05在node.js环境中执行javascript代码</p>
<p>​    执行js文件中的代码  node  文件名称</p>
<p>​    node 第一个文字  + tab可以快速补全路径</p>
<p>​    使用esc键快速清空命令</p>
<p>​    cls命令可以清空终端中的命令(清屏)</p>
<p>P06 fs文件系统模块</p>
<p>​        什么是fs文件系统模块？</p>
<p>​            是node提供的用来操作文件的模块，</p>
<p>​            fs.readFile()方法，用来读取指定文件中的内容</p>
<p>​            fs.writeFile()方法，用来向指定的文件中写入内容</p>
<p>​        在js代码中，使用fs模块来操作文件，需要先进行导入</p>
<p>​        </p>
<pre><code class="lang-javascript">const fs = require(&#39;fs&#39;)
</code></pre>
<p>​        02,读取指定文件中的内容</p>
<p>​            fs.readFile()语法格式</p>
<p>​            </p>
<pre><code class="lang-javascript">fs.readFile(path[, options], callback)
参数解读：
    1.path  必选参数，字符串，表示文件的路径
    2.可选参数，表示以什么编码格式来读取文件
    3.必选参数，文件读取完成后，通过回调函数拿到读取的结果

    实例
        const fs = require(&#39;fs&#39;)
        fs.readFile(&#39;utf8&#39;, function(err, dataStr) {
            console.log(err)
            console.log(&#39;------&#39;)
            console.log(dataStr)
        })
</code></pre>
<p>​        3.判断文件是否读取成功   node-code   02代码</p>
<p>P07  fs文件系统模块</p>
<p>​        2.3  向指定的文件中写入内容</p>
<p>​                1，fs.writeFile()的语法格式</p>
<p>​                    使用fs.writeFile() 语法格式</p>
<p>​                    </p>
<pre><code class="lang-javascript">fs.writeFile(file, data[, options], callback)
参数解读:
    1,必选参数，需要指定一个文件路径的字符串，表示文件的存放路径
    2，必选参数，表示要写入的内容
    3，可选参数，表示以什么样的格式写入文件内容，默认是utf8
    4.必选参数，文件写入后的回调函数
</code></pre>
<p>判断内容是否成功</p>
<p>P09  fs模块-路由动态拼接的问题</p>
<p>​        <strong>在使用fs模块操作文件时，如果提供的操作路径是以./或者../开头的相对路径时，很容易出现路径动态拼接错误的原因，代码在运行的时候，会以执行node命令时所处的目录，动态拼接出被操作文件的完整路径。</strong></p>
<p>path路劲模块</p>
<p>​        path是node官方提供用来处理路径的模块</p>
<p>​                例如：</p>
<p>​                        path.join()  可以将多个路径片段拼接成一个完整的路径字符串</p>
<p>​                        path.basename()  方法，从路径字符串中将文件名解析出来</p>
<p>​                js中使用的话，要先进行导入 </p>
<p>​                    </p>
<pre><code class="lang-javascript">const path = require(&#39;path&#39;);
</code></pre>
<p>path路径的拼接</p>
<pre><code>        path.join语法格式
        path.join([...paths])
        参数
            paths   路径的片段序列
            返回值   string
            ../  有抵消路径的功能

     path.basename(path[, ext])
         可以获取路径中最后一步分，经常通过这个方法获取路径中的文件名
         path  参数一是必填项，表示一个路径的字符串
         ext&lt;string&gt;  可选参数，表示文件的扩展名
         返回 string  表示路径最后的部分

     path.extname()  的语法格式
         使用该方法，可以获取路径中的扩展名部分
         path.extname(path)
         path
         string   扩展名的部分
</code></pre><p>P14  http模块</p>
<p>​        什么是客户端，什么是服务器？</p>
<p>​        在网络节点中，负责消费资源的电脑，叫做客户端；负责对外提供网络资源的电脑，叫做服务器。</p>
<p>​        <strong>http模块</strong>是node.js官方提供的，用来创建web服务器的模块。通过http模块提供的http.createServer()方法，就能把一台普通的电脑，变成一台web服务器，从而对外提供web资源服务。</p>
<p>​        先进行导入</p>
<pre><code class="lang-javascript">const http = require(&#39;http&#39;)
</code></pre>
<p>理解http模块的作用。</p>
<p>服务器和普通电脑的区别在于，服务器上安装了web服务器软件，例如: iis apache等，通过安装这些服务器软件，就可以把普通的电脑变成web服务器。</p>
<p>phpStudy安装后集成了Apache和mySql，红色状态表示未启动。安装了软件就是服务器</p>
<h4 id="p15-02-">P15-02-和服务器相关的概念</h4>
<p>1.ip地址</p>
<p>​    具有唯一性，每个计算机的唯一地址，只有知道ip地址的前提下才可以访问。</p>
<p>​    01.运行 ping <a href="http://www.baidu.com">www.baidu.com</a>  可以看到网址</p>
<p>​    02.开发时候，可能是服务器，也可能是服务端，输入127.0.0.1就可以访问自己提供的web服务，仅仅供自己使用。</p>
<p>2.域名和域名服务器</p>
<p>​    ip和域名是一一对应的，存放再域名服务器中(DNS).域名服务器就是提供ip地址和域名之间的转换服务的服务器。</p>
<p>3.端口号</p>
<p>​    每个服务对应一个web服务</p>
<h4 id="p16-03-web-">P16-03-创建web基本服务器的步骤</h4>
<p>​    01.导入http模块</p>
<pre><code class="lang-javascript">const http = require(&#39;http&#39;)
</code></pre>
<p>​    02.创建web服务器实例,调用httpcreateserve方法，即可快速创建一个web服务器实例</p>
<pre><code class="lang-javascript">const server = http.createServer()
</code></pre>
<p>​    03.为服务器绑定request事件，监听客户端的请求</p>
<pre><code class="lang-javascript">1.使用服务器实例的方法server.on（），为服务器绑定一个request方法
server.on(&#39;request&#39;, (req, res) =&gt; {
    // 只要有客户端来请求我们自动的服务器，就会触发request时间，从而调用这个时间处理函数
    console.log(&#39;Someone visit our web server&#39;)
})
</code></pre>
<p>​    04.启动服务器,调用服务器实例，调用listen()方法，即可启动web服务器</p>
<pre><code>server.listen(80, () =&gt; {
    console.log(&#39;http server running at http://127.0.0.1&#39;)
})
</code></pre><p>3.req请求对象</p>
<p>​    只要服务器收到了客户端的请求，就会通过server.on() 为服务器绑定request()时间处理函数。</p>
<p>​    如果想在时间处理函数中，访问与客户端相关的数据内容，可以使用如下方法</p>
<p>​    浏览器发起的是默认的get请求</p>
<pre><code class="lang-JavaScript">server.on(&#39;request&#39;, function () {
   // req是请求对象，它包含了客户端相关的数据和属性 例如
    // req.url 是客户端请求的url地址
    // req.method 是客户端的method请求类型
    cosnt str = &#39;your request url is ${req.url}, and request method is ${req.method}&#39;
    consolr.log(str)
})
</code></pre>
<p>4.res响应对象</p>
<p>​    在服务器的request事件处理函数中，如果想访问与服务器相关的数据或者属性</p>
<pre><code class="lang-javascript">res.end()  响应内容，结束请求，向客户端发送指定的内容，并结束这次请求处理的结果
</code></pre>
<p>5.解决中文乱码问题</p>
<p>使用res.end() 方法时，向客户端发送中文内容时，出现乱码的问题，需要通过手动设置内容的编码格式。</p>
<pre><code class="lang-javascript">const http = require(&#39;http&#39;);
const server = http.createServer();
server.on(&#39;request&#39;, (req, res) =&gt; {
  // 定义一个字符串，包含要发送的内容
  const str = `您请求的url地址是 ${req.url}, 请求的method类型为 ${req.method}`;
  // 为了防止乱码，调用res.setHeader() 方法，设置content-type响应头，解决总中文乱码的问题
  res.setHeader(&#39;Content-Type&#39;, &#39;text/html; charset=utf-8&#39;);
  res.end(str); // 将内容响应给客户端
});

server.listen(80, () =&gt; {
  console.log(&#39;server running at http://127.0.0.1&#39;)
});
</code></pre>
<h4 id="p17-url-html-">P17-跟据不同的url响应不同的html的内容</h4>
<p>实践步骤</p>
<p>​    1.拿到不同的url地址</p>
<p>​    2.设置默认的响应内容为404 not fount</p>
<p>​    3.判断用户请求的是否为/或index.html首页</p>
<p>​    4.判断用户请求的是否为/about.html关于页面</p>
<p>​    5.设置content-type响应头，防止中文乱码</p>
<p>​    6.使用res.end 把响应内容响应给客户端</p>
<pre><code>server.on(&#39;request&#39;, function(req, res) {
  const url = req.url;
  let content = `&lt;h1&gt;&lt;/h1&gt;`
})
</code></pre><p>P18-实现clock时钟的web服务器</p>
<p>1.核心思路</p>
<p>把文件的实际存放路径，作为每个资源的请求url地址;</p>
<p>2.实现步骤</p>
<p>​    01 导入需要的模块</p>
<p>​    02.创建基本的服务器</p>
<p>​    03.将资源url的请求url地址映射为文件的存放路径</p>
<p>​    04.读取文件内容并响应给客户端</p>
<p>​    05.优化资源的请求路径</p>
<h4 id="p19-">P19-模块化的概念</h4>
<p>1.模块化的基本概念</p>
<p>​    模块化是解决复杂问题时，自顶向下把系统划分成为若干模块的过程，对整个系统来说，模块是可组合，分解和更换的单元。</p>
<p>1.1 编程领取中的模块化，就是遵守固有的规则，把一个大文件拆成独立并互相依赖的多个模块。</p>
<p>​    好处：  提高代码的复用性   可维护性   实现按需加载</p>
<p>1.2规范·</p>
<p>​    就是对代码进行模块化拆分与组合时，需要遵守的规则</p>
<p>例如：</p>
<pre><code> 使用什么样的语法格式来引用模块
</code></pre><p>​     在模块中使用什么样的语法向外暴露成员</p>
<p>好处： 使用一样的代码规范，降低沟通成本，极大方便了各个模块的相互调用</p>
<h4 id="p20-node-js-">P20 node.js 中模块化的分类</h4>
<p>1.1分为了三大类</p>
<p>​        内置模块(由node.js官方提供的，例如fs，path，http等)</p>
<p>​        自定义模块(用户创建的每个js文件，都是自定义模块)</p>
<p>​        第三方模块(由第三方开发出来的模块，并非官方提供的内置模块，也不是用户创建的自定义模块，使用的需要先下载)</p>
<p>1.2 加载模块</p>
<p>使用强大的require()方法，可以加载需要的内置模块，用户自定义模块，第三方模块进行使用</p>
<p>​        内置  const fs = require(&#39;path&#39;)</p>
<p>​        自定义 cosnt custom = require(&#39;./custom.js&#39;)</p>
<p>​        第三方  const moment = require(&#39;moment&#39;)</p>
<p><strong>使用require()方法加载其他模块的时候，会执行被加载模块的代码</strong> </p>
<p>使用require加载模块的时候，可以省略.js的后缀名</p>
<h4 id="p21-node-js-">P21 node.js中的模块化</h4>
<p>​    01 node.js 中的模块作用域</p>
<p>​        什么是模块作用域</p>
<p>​            和函数作用域类似，在自定义模块中定义的变量，方法等成员，只能在当前模块内被访问，这种模块级别的访问限制，叫做模块作用域。只能在模块内部访问，引入之后得到的也是空对象，可以防止全局变量污染的问题。</p>
<p>02.modules对象</p>
<p>​        向外共享模块作用域中的成员</p>
<p>​        module对象</p>
<p>​        每个.js自定义模块中都有一个module对象，它里面存储了和当前模块有关的信息，打印如下：</p>
<p>​            <img src="D:\soft\Typora\note\node\image\module.png" alt="./"></p>
<p>P22 module.exports 对象向外共享作用域中的成员</p>
<p>​    1.1    module.exports</p>
<p>在自定义模块中，可以使用module.exports对象，将模块内的成员共享出去，供外界使用</p>
<p>外界用require() 方法导入自定义模块时，得到的就是module.exports 所指向的模块</p>
<p>其实导入的时候，导入的是module.exports中的内容，默认的文件中module.exports中的内容为空</p>
<p>1.3 共享成员时候的注意点</p>
<p>​    使用require()方法导入模块时，导入的结果，永远以module.exports指向的对象为准</p>
<p>P23 exports对象</p>
<p>​    由于module.exports 单词写起来比较复杂，为了简化向外共享成员的代码，Node提供了exports对象，默认情况下，exports和module.exports指向 一个对象，最终共享结果，还是以module.exports指向的对象为准。</p>
<p>P24 exports 和 module.exports的使用误区</p>
<p>​    时刻谨记，require()模块时，得到的永远是module.exports指向的对象</p>
<p> <strong>注意：</strong>为了防止混乱，建议不要同时使用exports和module.exports</p>
<p>P24 node.js遵守的模块化规范</p>
<p>​        遵循了common.js规范，commonJS规定了模块的特性和各模块之间如何相互依赖。</p>
<p>​        commonJS规定：</p>
<p>​                1，每个模块内部， module变量代表当前模块</p>
<p>​                module 变量是一个对象，它的exports属性(即module.exports)是对外的接口</p>
<p>​                加载某个模块的时候，其实加载的就是该模块的module.exports属性，require()方法用于加载模块</p>
<h4 id="p25-npm-">P25 npm 与包相关的概念</h4>
<p>​    1.包</p>
<p>​    node.js中第三方模块又叫做包</p>
<ol start="2">
<li><p>包的来源</p>
<p>是第三方人或者团队开发出来的</p>
<p><strong>注意</strong> node.js中的包都是开源且免费的，不需要付费即可免费下载使好用</p>
<ol start="3">
<li>为什么需要包</li>
</ol>
<p>由于node.js的内置模块仅仅提供了一些底层的API，导致在基于内置模块进行项目开发时，效率很低。</p>
<p><strong>包是基于内置模块封装出来的，提供了更高级，更方便的Api，极大的提高了开发效率</strong></p>
<p>包和内置模块之间的关系，类似于jq和浏览器内置api的关系</p>
<ol start="4">
<li>从哪里下载包</li>
</ol>
<p>npm  Inc  国外一家IT公司，最大的包共享平台</p>
</li>
</ol>
<pre><code>#### P26.格式化时间的传统做法

1.自己定义一个时间格式化的函数，通过module.exports 进行暴露，之后通过调用进行

2.高级格式化的时间

​    01 使用包管理工具安装格式化时间的包

​    02 使用require导入第三方的包

​    03 参考moment的官方API文档对时间进行格式化

#### P27 初次装包后多了那些文件

  初次装包完成后，在项目文件下多了一个node_modules 和package-lock.json的配置文件

  node_modules 用来存放已经安装的包   require导入包的时候就是从这里进行导入的

  package-lock.json  配置文件用来记录node_modules目录下的每一个包的下载信息

安装的时候 可以通过@来指定安装的版本 npm i moment@2.22.2

 1. 包的版本号定义规范 

    包的版本号是点分十进制形式进行的，总共有三位数字，例如 2.24.0

    第一位  大版本

    第二位  功能版本

    第三位  bug修复版本

    **规则**  只要前面的版本号增长了，则后面的版本号归0
</code></pre><h4 id="p28-">P28. 包管理文件的配置</h4>
<p>​            npm规定，在项目根目录中，必须提供一个叫做package.json的包管理配置文件，用来记录与项目有关的一切配置信息。例如：</p>
<p>​            项目的名称,版本号，描述等</p>
<p>​            项目中都用到了哪些包</p>
<p>​            那些包只在开发期间会用到</p>
<p>​            哪些包在开发和部署时都需要用到</p>
<p>多人协作时包管理问题</p>
<p>​    在项目中创建一个package.json的配置文件，记录安装了哪些包。从而方便剔除node_modules目录之后，在团队成员之间共享源码。</p>
<p>​    <strong>注意</strong>  在今后项目开发中，一定要把node_modules文件添加到.gitignore文件中</p>
<p>03 快速创建package.json     </p>
<p>​        npm包提供了一个快捷命令，可以在执行命令时所处的目录中，快速创建package.json这个包管理配置文件</p>
<p>​        npm init -y    // 在执行命令的目录中，快速新建package.json 文件</p>
<p><strong>注意</strong> 只能在英文的目录下成功运行！ 所以，项目文件一般最好以英文命名，不要使用中文，不能出现空格</p>
<p>​        运行npm install 命令安装包的时候，npm包管理工具会自动把版本号和包的名称，记录到package.json文件中</p>
<p>04 dependences节点</p>
<p>​    package.json节点中，专门用来记录使用npm Install 命令安装了哪些包</p>
<ol start="5">
<li><p>一次性安装所有的包</p>
<p>npm i就可</p>
</li>
</ol>
<p>6 卸载包  运行npm uninstall 命令，来卸载指定的包(没有快捷命令)</p>

          	</article>
        </div>
		</div>
  </body>
</html>
<script type="text/javascript" src="toc/js/jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="toc/js/jquery.ztree.all-3.5.min.js"></script>
<script type="text/javascript" src="toc/js/ztree_toc.js"></script>
<script type="text/javascript" src="toc_conf.js"></script>

<SCRIPT type="text/javascript" >
<!--
$(document).ready(function(){
    var css_conf = eval(markdown_panel_style);
    $('#readme').css(css_conf)
    
    var conf = eval(jquery_ztree_toc_opts);
		$('#tree').ztree_toc(conf);
});
//-->
</SCRIPT>